﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SIGEB.Prototipo.Control;
using SIGEB.Modelo;
using SIGEB.Modelo.moduloGrupo;
using SIGEB.Modelo.moduloUsuarios;
using SIGEB.Modelo.moduloPerfiles;
using SIGEB.Modelo.moduloNotificaciones;
using SIGEB.Prototipo.Vista.moduloUsuarios;

namespace SIGEB.Prototipo.Vista.moduloNotificaciones
{
    public partial class frm_EnviarNotificacion : frm_ModuloBase
    {
        #region "constructores"

        public frm_EnviarNotificacion()
        {
            InitializeComponent();
            tv_Grupos.Nodes.Add("Grupos");
            cargarDatos();
        }

        public frm_EnviarNotificacion(controlPrincipal cp) : base(cp)
        {
            InitializeComponent();
            asignarUI(this.Controls);
            tv_Grupos.Nodes.Add("Grupos");
            cargarDatos();
        }

        #endregion

        #region "metodos"

        private void busquedaTreeView(string idU)
        {
            LinkedList<usuario> lu = new LinkedList<usuario>();
            if (gruposAsociados != null && gruposAsociados.Count > 0)
            {
                foreach (grupo gr in gruposAsociados)
                {
                    usuariosPorGrupo = cp.ctrlNotificaciones.obtenerUsuarios(gr.codGrupo);
                    if (usuariosPorGrupo != null && usuariosPorGrupo.Count > 0)
                    {
                        foreach (usuario usr in usuariosPorGrupo)
                        {
                            if (usr.idUsuario.Equals(idU))
                            {
                                if (tv_Grupos.Nodes != null && tv_Grupos.Nodes.Count > 0)
                                {
                                    if (tv_Grupos.Nodes[0].Nodes != null && tv_Grupos.Nodes[0].Nodes.Count > 0)
                                    {
                                        tv_Grupos.SelectedNode = tv_Grupos.Nodes[0].Nodes[getIndexFromNodeText(gr.nombre, false)].Nodes[getIndexFromNodeText(usr.nombre + " " + usr.apellido1 + " " + usr.apellido2, true)];
                                        tv_Grupos.Focus();
                                        return;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            mostrarInfo("La búsqueda no generó ningún resultado.");
        }

        private int getIndexFromNodeText(string text, bool children)
        {
            if(tv_Grupos.Nodes[0].Nodes != null && tv_Grupos.Nodes[0].Nodes.Count > 0){
                foreach(TreeNode tn in tv_Grupos.Nodes[0].Nodes){
                    if (!children && tn.Text.Equals(text))
                    {
                        return tn.Index;
                    }
                    if(children && tn.Nodes != null && tn.Nodes.Count > 0)
                    {
                        foreach(TreeNode tn2 in tn.Nodes){
                            if(tn2.Text.Equals(text)){
                                return tn2.Index;
                            }
                        }
                    }
                }
            }
            return -1;
        }

        private void cargarDatos()
        {
            gruposAsociados = cp.ctrlNotificaciones.obtenerGrupos();
            usuariosTodos = cp.ctrlNotificaciones.obtenerUsuariosTodos();
            llenarTreeViewGrupos();
        }

        private void llenarTreeViewGrupos()
        {
            borrarNodos();
            TreeNode tn_nodo = new TreeNode();
            TreeNode tn_nodo2 = new TreeNode();

            if (gruposAsociados != null)
            {
                int i = 0;
                foreach (grupo g in gruposAsociados)
                {
                    usuariosPorGrupo = cp.ctrlNotificaciones.obtenerUsuarios(g.codGrupo);
                    if (usuariosPorGrupo != null && usuariosPorGrupo.Count > 0)
                    {
                        tn_nodo = tv_Grupos.Nodes[0].Nodes.Add(g.nombre);
                        foreach (usuario u in usuariosPorGrupo)
                        {
                            if (g.codGrupo.Equals(u.idGrupo))
                            {
                                tn_nodo2 = tv_Grupos.Nodes[0].Nodes[i].Nodes.Add(u.nombre + " " + u.apellido1 + " " + u.apellido2);
                            }                                
                        }
                    }
                    i++;
                }
            }
        }

        private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
        {
            foreach (TreeNode node in treeNode.Nodes)
            {
                node.Checked = nodeChecked;
                if (node.Nodes.Count > 0)
                    this.CheckAllChildNodes(node, nodeChecked);
            }
        }

        private void borrarNodos()
        {
            if(tv_Grupos.Nodes.Count > 0)
            {
                ClearNodes(tv_Grupos.Nodes[0]);
                tv_Grupos.Nodes[0].Nodes.Clear();
            }
        }

        private void ClearNodes(TreeNode treeNode)
        {
            if (treeNode.Nodes.Count > 0)
            {
                foreach (TreeNode node in treeNode.Nodes)
                {
                    if (node.Nodes.Count > 0)
                    {
                        node.Nodes.Clear();
                    }
                }
            }
        }

        private void CheckChildren(TreeNode rootNode, bool isChecked)
        {
            foreach (TreeNode node in rootNode.Nodes)
            {
                CheckChildren(node, isChecked);
                node.Checked = isChecked;
            }
        }

        private void ResetTodo()
        {
            tv_Grupos.CollapseAll();
            CheckChildren(tv_Grupos.Nodes[0], false);
            tv_Grupos.Nodes[0].Checked = false;
            txt_destinatario.Text = string.Empty;
            txb_Mensaje.Text = string.Empty;
            lbl_mensajes.Text = string.Empty;
            borrarError(txb_Mensaje);
        }

        private LinkedList<string> recopilarEmails()
        {
            LinkedList<string> nombreUsuarios = new LinkedList<string>();
            LinkedList<string> emailUsuarios = new LinkedList<string>();

            if (tv_Grupos.Nodes[0].Nodes != null && tv_Grupos.Nodes[0].Nodes.Count > 0)
            {
                foreach (TreeNode tn in tv_Grupos.Nodes[0].Nodes)
                {
                    if (tn.Nodes != null && tn.Nodes.Count > 0)
                    {
                        foreach (TreeNode tn2 in tn.Nodes)
                        {
                            if (tn2.Checked)
                            {
                                nombreUsuarios.AddLast(tn2.Text);
                            }
                        }
                    }
                }
            }
            if (nombreUsuarios != null && nombreUsuarios.Count > 0)
            {
                foreach (string s in nombreUsuarios)
                {
                    if (gruposAsociados != null && gruposAsociados.Count > 0)
                    {
                        foreach (grupo grp in gruposAsociados)
                        {
                            usuariosPorGrupo = cp.ctrlNotificaciones.obtenerUsuarios(grp.codGrupo);
                            if (usuariosPorGrupo != null && usuariosPorGrupo.Count > 0)
                            {
                                foreach (usuario usr in usuariosPorGrupo)
                                {
                                    if ((usr.nombre + " " + usr.apellido1 + " " + usr.apellido2).Equals(s))
                                    {
                                        if(!usr.email.Equals(string.Empty))
                                        {
                                            emailUsuarios.AddLast(usr.email);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return emailUsuarios;
        }

        public override void hacerVisible(object[] arg)
        {
            base.hacerVisible(arg);
            if (!cp.usuarioActualPuede(acciones.NOTIFICACION_ENVIAR))
            {
                txb_Mensaje.Enabled = false;
                btn_enviar.Enabled = false;
            }
            else
            {
                txb_Mensaje.Enabled = true;
                btn_enviar.Enabled = true;
            }
        }

        #endregion

        #region "eventos"

        private void txt_destinatario_TextChanged(object sender, EventArgs e)
        {
            lbl_mensajes.Text = string.Empty;
        }

        private void txb_Mensaje_TextChanged(object sender, EventArgs e)
        {
            borrarError(txb_Mensaje);
            lbl_mensajes.Text = string.Empty;
        }

        public override void actualizar(object referencia, bibliotecaObservador.EventoActualizacion e)
        {
            int numConjunto = (int)referencia;
            if(numConjunto.Equals(conjuntoBase.CONJGRUPOS))
            {
                cargarDatos();
            }
            if(numConjunto.Equals(conjuntoBase.CONJUSUARIOS))
            {
                cargarDatos();
            }
        }

        protected override void CerrarVentana(object sender, FormClosingEventArgs e)
        {
            base.CerrarVentana(sender, e);
            ResetTodo();    
        }

        private void tv_Grupos_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Action != TreeViewAction.Unknown)
            {
                if (e.Node.Nodes.Count > 0)
                    CheckAllChildNodes(e.Node, e.Node.Checked);
            }
        }

        private void btn_Buscar_Click(object sender, EventArgs e)
        {
            objetoReturn a = new objetoReturn();
            new busquedaUsuario(usuariosTodos, a).ShowDialog();
            txt_destinatario.Text = a.objeto;
            busquedaTreeView(txt_destinatario.Text);
        }

        private void btn_enviar_Click(object sender, EventArgs e)
        {
            if (cp.usuarioActualPuede(acciones.NOTIFICACION_ENVIAR))
            {
                if (!txb_Mensaje.Text.Equals(string.Empty))
                {
                    LinkedList<string> emails = recopilarEmails();
                    if (emails != null && emails.Count > 0)
                    {
                        if(erp_error.GetError(txb_Mensaje).Equals(string.Empty))
                        {
                            objetoReturnCompuesto obj = new objetoReturnCompuesto("","");
                            new PeticionUsrPwd(obj).ShowDialog();
                            lbl_mensajes.Text = "Enviando...";
                            if (!cp.ctrlNotificaciones.enviarNotificaciones(txb_Mensaje.Text, recopilarEmails(), obj.objeto1, obj.objeto2))
                            {
                                mostrarInfo( "Ha ocurrido un error al enviar el mensaje.");
                            }
                            else
                            {
                                mostrarInfo("El mensaje ha sido enviado con éxito.");
                            }
                            ResetTodo();
                        }
                    }
                    else
                    {
                        lbl_mensajes.Text = "No ha seleccionado ningún Grupo/Usuario como destinatario.";
                    }
                }
                else
                {
                    setError(txb_Mensaje, "Ingrese un mensaje.");
                }  
            }
            else
            {
                lbl_mensajes.Text = "El usuario actual no cuenta con los permisos necesarios para realizar esta acción.";
            }
        }

        #endregion

        #region "atributos"

        private LinkedList<grupo> gruposAsociados;
        private LinkedList<usuario> usuariosPorGrupo;
        private LinkedList<usuario> usuariosTodos;

        #endregion
    }
}
